﻿using System.Collections.Generic;
using System.Text;
using Core.Domain;
using Core.Domain.Lexems;

namespace Core.SyntaxAnalysis.Classes
{
    public class Label : Stmt
    {
        private readonly Stmt m_after;
        public readonly Lexem Number;

        public Label(Lexem number, Stmt after)
        {
            Number = number;
            m_after = after;
        }

        public static Label Create(Lexem number, Stmt after)
        {
            return Env.AddLabel(number, after);
        }

        public override bool StmtSemanticCheck(ref List<CompilerError> errors)
        {
            bool res = Env.FindLabel(Number) == this; // сравниваются ссылки. Если в таблице Env с данным номером связана эта Label, то все хорошо. Если нет - то существует две Label с одинаковой цифрой
            if (!res)
            {
                errors.Add(new CompilerError(errors.Count + 1, Resources.LabelNameWasAlreadyUsedErrorMessage + Number.StrValue, Number));
            }
            res = m_after.SemanticCheck(ref errors);
            return res;
        }

        public override void StmtGenerate(StringBuilder s)
        {
            CodeGenerator.AppendLabel(s, this);
            m_after.Generate(s);
        }
    }
}